/*Copyright (C) 2009 - 2011 MASSART GAUTHIER and Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef GESTIONNAIRE_SON_HEADER
#define GESTIONNAIRE_SON_HEADER

#include <CSLP/System.h>
#include <SDL/SDL_mixer.h>
#include "../types/types.h"

#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif

typedef enum Sons {
	DING,
	CROIX,
	PAS,
	PERDU,
	GAGNE,
	BRAVO,
	VIEGAGNEE,
	VIEPERDUE,
	MANGE,
	TETRISLIGNEPLEINE,
	TETRISECLAIR,
	TETRISENBAS,
	TETRISNEWLEVEL,
	TETRISTOURNER,
	PONGBALLEPERDUE,
	PONGRAQUETTE,
	PONGCOTE,
	TOWERBOOM,
	TOWERCOTE,
	TOWERTRANSITION,
	TOWERDESCENDRE,
	TOWERPOSER,
	/*insérer les nouveaux sons *avant* Count*/
	Count 		/*réservé pour usage interne.*/
} Sons;

typedef enum musics {
	CREDITS,
	TETRIS,
	/*insérer les nouvelles musiques *avant* Count*/
	CountM 		/*réservé pour usage interne.*/
} musics;

typedef struct thread_son_vars {
	File son;
	File music;
	bool quitter;
	bool running;
	bool is_music_paused;
	bool loop;
	bool stop;
	bool next;
	bool shuffle;
	unsigned char volume_musique;
	unsigned char volume_son;
} thread_son_vars;

typedef struct intern_playlist_node {
	Mix_Music *music;
	int enumValue;
} intern_playlist_node;

/*
** Permet de lancer le thread chargé de gérer le son
**
** \return true en cas de succès
** \return false en cas d'échec
*/
bool init_gest_sons();

/*
** Permet de jouer un son de l'énumération Sons
**
** \param soundToPlay Un son définit par l'énumération Sons,
** différent de Count (réservé pour usage interne).
** \return true si le thread est en fonctionnement
** \return false si le thread n'est pas lancé.
*/
bool jouer_son(Sons soundToPlay);

/*
** Permet de jouer une musique de l'énumération musics
**
** \param musicsToPlay Une musique définit par l'énumération musics,
** différent de CountM (réservé pour usage interne).
** \return true si le thread est en fonctionnement
** \return false si le thread n'est pas lancé.
*/
bool play_music(musics musicsToPlay);

/*
** Permet d'initialiser la pause de la musique
**
** \param toPause Indique si la musique doit être mis en pause (true)
** ou non (false).
** \return true si le thread est en fonctionnement
** \return false si ce n'est pas le cas
*/
bool pause_music(bool toPause);

/*
** Permet de savoir si la musique est en pause
** Attention, si le thread est arréter, la valeur de retour
** de la fonction n'est pas significative.
**
** \return true si la musique est en pause
** \return false si elle ne l'est pas
*/
bool is_music_paused();

/* Permet de jouer en boucle la musique en cours de lecture.
** \param is_looping Indique si la musique doit être jouée en boucle ou non
*/
void music_loop(bool is_looping);

/* Permet de savoir si la musique est jouée en boucle ou non.
** \return true si la musique boucle.
**         sinon false.
*/
bool is_music_looping();

/* Permet d'arrêter ou de reprendre la musique
** \param stoped Indique si la musique doit être stoppée ou non.
*/
void stop_music(bool stoped);

/* Permet de savoir si la musique a été arrétée.
** \return true  Si la musique est arrêtée.
**         false Si la musique est lue.
*/
bool is_music_stoped();

/* Permet d'arrêter la musique en train d'être jouée
** pour passer à la suivante. Si la musique est arréter,
** elle est remise en lecture. Ce n'est pas le cas si
** elle est en pause.
*/
void next_music();

/* Permet de changer de mode de lecture entre aléatoire
** et continu.
** \param shuffle Indique si la musique doit être jouée aléatoirement (true)
**                ou de façon continue (false).
*/
void music_set_mode_shuffle(bool shuffle);

/* Permet de connaitre le mode de lecture courant.
** \return true si la musique est jouée aléatoirement.
**         sinon flase.
*/
bool music_get_mode_shuffle();

/*
** Permet de fermer le thread chargé de gérer le son
*/
void close_gest_sons();

#endif
